package com.gxc.array;

import java.util.Scanner;

/**
 * 某部门开展 Family Day 开放日活动，其中有个从桶里取球的游戏，游戏规则如下：有 N 个容量一样的小桶等距排开，且每个小桶都默认装了数量不等的小球，每个小桶装的小球数量记录在数组 bucketBallNums 中，游戏开始时，要求所有桶的小球总数不能超过 SUM，如果小球总数超过 SUM，则需对所有的小桶统一设置一个容量最大值 maxCapacity，并需将超过容量最大值的小球拿出来，直至小桶里的小球数量小于 maxCapacity。请您根据输入的数据，计算从每个小桶里拿出的小球数量？限制规则一：所有小桶的小球总和小于 SUM，则无需设置容量值 maxCapacity，并且无需从小桶中拿球出来，返回结果[] 限制规则二：如果所有小桶的小球总和大于 SUM，则需设置容量最大值 maxCapacity，并且需从小桶中拿球出来，返回从每个小桶拿出的小球数量组成的数组
 *
 * 输入描述
 * 第一行输入 2 个正整数，数字之间使用空格隔开，其中：第一个数字表示 SUM 第二个数字表示 bucketBallNums 数组长度.
 * 第二行输入 N 个正整数，数字之间使用空格隔开，表示 bucketBallNums 的每一项
 * 备注
 * 1 ≤ bucketBallNums[i] ≤ 10^9 1 ≤ bucketBallNums.length = N ≤ 10^5 1 ≤ maxCapacity ≤ 10^9 1 ≤ SUM ≤ 10^9
 *
 * 输出描述
 * 从每个小桶里拿出的小球数量，并使用一维数组表示
 */
public class FamilyDay {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long sum = scanner.nextLong();
        int n = scanner.nextInt();
        Long[] bucketBallNums = new Long[n];

        long total = 0, max = 0;
        for (int i = 0; i < n; i++) {
            long num = scanner.nextLong();
            total += num;
            bucketBallNums[i] = num;
            max = Math.max(max, num);
        }
        scanner.close();

        if (total <= sum) {
            System.out.println("[]");
            return;
        }

        //二分查找最大容量值
        long left = 0, right = max;
        while (left < right) {
            long mid = left + (right - left + 1) / 2;
            if (check(bucketBallNums, sum, mid)) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }

        // 按格式输出结果
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < bucketBallNums.length; i++) {
            if (i > 0) sb.append(",");
            sb.append(Math.max(0, bucketBallNums[i] - left));
        }
        sb.append("]");
        System.out.println(sb.toString());
    }

    private static boolean check(Long[] bucketBallNums, long sum, long max) {
        long res = 0;
        for (int i = 0; i < bucketBallNums.length; i++) {
            long n = bucketBallNums[i] > max ? max : bucketBallNums[i];
            res += n;
            if (res > sum) return false;
        }
        return res<=sum;
    }
}
